public class Bean管理 {


    //Bean对象：Spring IOC容器 中 由Spring创建、管理的对象，称之为bean对象。


    /*
    👀默认情况下，Spring项目启动时，会把bean(通过@Component @Controller @Service @Mapper等注解标注的类,将由Spring管理,创建对象)都创建好放在IOC容器中，如果想要主动获取这些bean，可以通过如下方式：

    根据name获取bean：Object getBean(String name)

    根据类型获取bean：<T> T getBean(Class<T> requiredType)

    根据name获取bean（带类型转换）：<T> T getBean(String name, Class<T> requiredType)

    注意事项:
    上述所说的 【Spring项目启动时，会把其中的bean都创建好】还会受到作用域及延迟初始化影响，这里主要针对于 默认的单例非延迟加载的bean而言。

    SpringBoot中通常使用@Autowired获取接口的实例
     */

    /**
     * 👀Bean作用域见模块下test/java/com/itheima/Bean作用域
     */

    /*
    👀第三方bean

    如果要管理的bean对象来自于第三方（不是自定义的），是无法用 @Component 及衍生注解声明bean的，就需要用到 @Bean注解。

    @SpringBootApplication
    public class SpringbootWebConfig2Application {
        @Bean //将方法返回值交给IOC容器管理,成为IOC容器的bean对象
        public SAXReader saxReader(){
            return new SAXReader();//SAXReader来自自三方jar包,无法通过在类上面加@Component注解来让SpringIOC-容器管理该类对象,但是可以像这样在启动类中自己定义一个函数,函数的返回值类型是第三方类型,
            而在函数体中,需要手动创建一个对象,作为返回值交给SpringIOC容器管理
        }
    }

    通常是在配置类中声明第三方bean,而启动类也是一个特殊的配置类,但是不建议在启动类中声明bean

    若要管理很多第三方bean对象，建议对这些bean进行集中分类配置，可以通过 @Configuration 注解声明一个配置类。

    @Configuration//让启动类扫描到配置类
    public class CommonConfig {
        @Bean//配置类中将第三方对象交给Spring管理
        public SAXReader saxReader(){
            return new SAXReader();
        }
    }


    通过@Bean注解的name或value属性可以声明bean的名称，如果不指定，默认bean的名称就是方法名,例如@Bean(name="bean的别名"),在获取bean的时候使用@Autowired()加上@Qualifier("bean的别名")来依赖注入, 或者 一步到位使用@Resource(type=类名.class,name = "bean的别名")//实现类不止一个时需要加上type=类名.class


    如果第三方bean需要依赖其它bean对象，直接在bean定义方法时设置形参即可，容器会根据类型自动装配。

    总结:
    @Component 及衍生注解 与 @Bean注解使用场景？
    项目中自定义的，使用@Component及其衍生注解
    项目中引入第三方的，使用@Bean注解
     */
}
